home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / DDJMAG / DDJ8607.ZIP / CARTER4.JUL next >
Text File  |  1986-07-31  |  54KB  |  2,480 lines

  1.  
  2. ***************************************************************** 
  3. *     RAFOS FORTH V1.0      26 March  1986                      * 
  4. *                                                               *
  5. *   --- ROM #2 of 2                                             *
  6. *                                                               *
  7. *  (C) Copyright 1986, Everett Carter. All rights reserved.     *
  8. *                                                               *
  9. *  This FORTH is a subset of the FORTH-79 standard.             * 
  10. *  Some changes have been made in order to save on              * 
  11. *  space in the limited memory of the float.                    * 
  12. *                                                               * 
  13. ***************************************************************** 
  14. ROM      EQU    $1000        ROM #2 start address
  15. ROM1     EQU    $1800        ROM #1 start address
  16. *
  17.          ORG    ROM
  18. *
  19. CR       EQU    $0D          CARRIAGE RETURN
  20. LF       EQU    $0A          LINE FEED
  21. BL       EQU    $20          BLANK
  22. BS       EQU    $08          Back Space
  23. DEL      EQU    $7F          Delete
  24. DDR      EQU    4            DATA DIRECTION REGISTER OFFSET 
  25. PORTA    EQU    0            I/O PORT 0 
  26. PORTB    EQU    1            I/O PORT 1 
  27. PUT      EQU    PORTB        SERIAL I/O PORT
  28. *
  29. INITSP   EQU    $7F          INITIAL STACK POINTER VALUE
  30. STACK    EQU    INITSP-5     TOP OF STACK 
  31. MEMSIZ   EQU    $2000        MEMORY ADDRESS SPACE SIZE
  32. SP0      EQU    $0F00 
  33. RP0      EQU    $0E00 
  34. TIB      EQU    $0D80 
  35. *     RAM VARIABLES 
  36. ATEMP    EQU    $10          TEMP USED IN PUTDEC
  37. XTEMP    EQU    $11          INDEX TEMPORARY
  38. GETR     EQU    $12          PICK & DROP TEMPORARY
  39. COUNT    EQU    $16          NUMBER OF BITS LEFT TO get/send
  40. CHAR     EQU    $17          Current input/output character 
  41. BYTCNT   EQU    $1E          bytcnt.
  42. WTIME    EQU    $20          TIMER INTERRUPT FROM WAIT STATE
  43. *
  44. *
  45. PH       EQU $21          MISC SCRATCH AREAS 
  46. PL       EQU $22 
  47. TEMPA    EQU $23 
  48. TEMPB    EQU $24
  49. QH       EQU $25
  50. QL       EQU $26
  51. TEMP     EQU $27
  52. TERM     EQU $28
  53. *
  54. *
  55. IN       EQU $29              Where FORTH will look for input
  56. OUT      EQU $2A
  57. COUNTR   EQU $2B
  58. DP       EQU $2C          The initial Dictionary pointer
  59. START    EQU $2E          The start up vector
  60. *
  61. *
  62. IP       EQU $30             THE FORTH INSTRUCTION POINTER
  63. RP       EQU $32             THE RETURN POINTER OFFSET
  64. SP       EQU $33             THE STACK POINTER OFFSET
  65. BASE     EQU $34
  66. *
  67. USER     EQU $35             The space for USER variables
  68. FENCE    EQU 0               USER + 0
  69. STATE    EQU 2               USER + 2
  70. FORTH    EQU 4               USER + 4
  71. CONTEXT  EQU 6               USER + 6
  72. CURRENT  EQU 8               USER + 8
  73. HLD      EQU $0A             USER + $0A
  74. *
  75. *
  76. *  List of previous FORTH words (ROM 1)
  77. *
  78. DOCOL  EQU $80            DOCOL
  79. DOCOL1 EQU DOCOL
  80. NEXT   EQU $009E          NEXT
  81. NEXT1  EQU $00CE
  82. LOAD   EQU $00D1
  83. GET    EQU $00D5
  84. TYPE   EQU $00DF          TYPE
  85. FIN6   EQU $0116          <FIND>
  86. BRAN   EQU $01A9          BRAN
  87. ZBRAN  EQU $19D2          ZBRANCH
  88. ZBREX  EQU ZBRAN+$12
  89. EXIT   EQU $19F8          EXIT
  90. EXE7   EQU $1A10          EXECUTE
  91. INLINE EQU $1A22
  92. EMIT   EQU $1A79          EMIT
  93. BL2    EQU $1A8D          BL
  94. WORD   EQU $1AA4          WORD
  95. MPY16  EQU $1AFD
  96. NUM8   EQU $1B27          <NUMBER>
  97. DROP   EQU $1BBE          DROP
  98. CFCH   EQU $1BCC          C@
  99. FTCH   EQU $1BF2          @
  100. DP2    EQU $1C1D          DP
  101. HERE   EQU $1C34          HERE
  102. NOT3   EQU $1C42          NOT
  103. ONEP   EQU $1C5B          1+
  104. HLD3   EQU $1C78          HLD
  105. DOUSE  EQU $1C7A          DOUSE
  106. STA5   EQU $1C91          STATE  
  107. CON7   EQU $1C9B          CONTEXT
  108. CUR7   EQU $1CA5          CURRENT
  109. FOR5   EQU $1CAF          FORTH
  110. STO    EQU $1CB9          !
  111. CSTO   EQU $1CE4          C!
  112. COMA   EQU $1D04          ,
  113. CCOMA  EQU $1D37          C,
  114. DUP3   EQU $1D55          DUP
  115. PLSTO  EQU $1D75          +!
  116. LAT6   EQU $1DAE          LATEST
  117. ALL5   EQU $1DBE          ALLOT
  118. LIT3   EQU $1DCC          LIT
  119. SWAP   EQU $1F07          SWAP
  120. CRE6   EQU $1FDE          CREATE
  121. *
  122. *
  123. *
  124. LOK   EQU $1E53
  125. OK    EQU LOK+1
  126. *
  127. *
  128. OUTER EQU $1E57
  129. COLD  EQU $1EA5
  130. WARM  EQU $1EE6
  131. GETC  EQU $1F43
  132. GETCHAR  EQU GETC
  133. PUTC   EQU $1F7A
  134. OUTCHAR  EQU PUTC
  135. WAIT   EQU $1FA8
  136. DELAY  EQU WAIT
  137. CRLF   EQU $1FC3
  138. RESET  EQU COLD
  139. *
  140. **************************************************************************
  141. *
  142. QUES   LDA DP          checks for errors at end of OUTER
  143.        STA GET+1
  144.        LDA DP+1
  145.        STA GET+2
  146.        LDX #1
  147.        JSR GET
  148.        CMP #$80        = buffer end ?
  149.        BNE QERR
  150. QEXIT  LDX SP
  151. *
  152. H1     EQU LOK/$100*$100
  153. L      EQU LOK-H1
  154. H      EQU LOK/$100
  155. *
  156.        LDA #L
  157.        DECX
  158.        STA SP0,X
  159.        LDA #H
  160.        DECX
  161.        STA SP0,X
  162.        STX SP
  163.        LDA START
  164.        STA IP
  165.        LDA START+1
  166.        STA IP+1
  167.        JMP NEXT
  168. QERR   LDA DP
  169.        STA LOAD+1
  170.        LDA DP+1
  171.        STA LOAD+2
  172.        CLRX
  173.        JSR GET
  174.        INCA
  175.        INCA
  176.        JSR LOAD
  177.        TAX
  178.        LDA #$3F        A='?'
  179.        JSR LOAD
  180.        LDX SP
  181.        LDA DP+1
  182.        DECX
  183.        STA SP0,X
  184.        LDA DP
  185.        DECX
  186.        STA SP0,X
  187.        STX SP
  188.        JMP WARM
  189. *
  190.        FCB 4           QUIT
  191.        FCC 'QUI'
  192.        FDB CRE6-6      link to CREATE
  193. QUIT   BRA QEXIT
  194. *
  195.        FCB 6           TOGGLE
  196.        FCC 'TOG'
  197.        FDB QUIT-6      link to QUIT
  198. TOG6   LDX SP
  199.        INCX            drop high byte
  200.        LDA SP0,X
  201.        INCX
  202.        STA ATEMP
  203.        LDA SP0,X       get addr
  204.        INCX
  205.        STA LOAD+1
  206.        STA GET+1
  207.        LDA SP0,X
  208.        INCX
  209.        STX SP
  210.        STA LOAD+2
  211.        STA GET+2
  212.        CLRX
  213.        JSR GET
  214.        EOR ATEMP
  215.        JSR LOAD
  216.        JMP NEXT
  217. *
  218.        FCB 9           IMMEDIATE
  219.        FCC 'IMM'
  220.        FDB TOG6-6      link to TOGGLE
  221. IMM9   JMP DOCOL
  222.        FDB LAT6
  223.        FDB LIT3
  224.        FDB $80
  225.        FDB TOG6
  226.        FDB EXIT
  227. *
  228.        FCB 5           -FIND
  229.        FCC '-FI'
  230.        FDB IMM9-6      link to IMMEDIATE
  231. DFND   JMP DOCOL
  232.        FDB BL2
  233.        FDB WORD
  234.        FDB CON7
  235.        FDB FTCH
  236.        FDB FTCH
  237.        FDB FIN6
  238.        FDB EXIT
  239. *
  240.        FCB 5           COUNT
  241.        FCC 'COU'
  242.        FDB DFND-6      link to -FIND
  243. COU5   JMP DOCOL
  244.        FDB DUP3
  245.        FDB ONEP
  246.        FDB SWAP
  247.        FDB CFCH
  248.        FDB EXIT
  249. *
  250.        FCB 1           0
  251.        FCC '0  '
  252.        FDB COU5-6      link to COUNT
  253. ZERO   LDX SP
  254.        CLRA
  255.        DECX
  256.        STA SP0,X
  257.        DECX
  258.        STA SP0,X
  259.        STX SP
  260.        JMP NEXT
  261. *
  262.        FCB 1           1
  263.        FCC '1  '
  264.        FDB ZERO-6      link to 0
  265. ONE    LDX SP
  266.        LDA #1
  267.        DECX
  268.        STA SP0,X
  269.        DECX
  270.        CLRA
  271.        STA SP0,X
  272.        STX SP
  273.        JMP NEXT
  274. *
  275.        FCB 1           2
  276.        FCC '2  '
  277.        FDB ONE-6       link to 1
  278. TWO    LDX SP
  279.        LDA #2
  280.        DECX
  281.        STA SP0,X
  282.        CLRA
  283.        DECX
  284.        STA SP0,X
  285.        STX SP
  286.        JMP NEXT
  287. *
  288.        FCB 2           2+
  289.        FCC '2+ '
  290.        FDB TWO-6      link to 2
  291. TWOP   LDX SP
  292.        INCX            point to low
  293.        LDA #2
  294.        ADD SP0,X
  295.        STA SP0,X
  296.        DECX            point to high
  297.        CLRA            A=0 note carry
  298.        ADC SP0,X       is not affected
  299.        STA SP0,X
  300.        JMP NEXT
  301. *
  302.        FCB $81         [  (IMMEDIATE)
  303.        FCC '[  '
  304.        FDB TWOP-6      link to 2+
  305. LBRAK  JMP DOCOL
  306.        FDB ZERO
  307.        FDB STA5
  308.        FDB STO
  309.        FDB EXIT
  310. *
  311.        FCB 1           ]
  312.        FCC ']  '
  313.        FDB LBRAK-6     link to [
  314. RBRAK  JMP DOCOL
  315.        FDB LIT3
  316.        FDB $C0
  317.        FDB STA5
  318.        FDB STO
  319.        FDB EXIT
  320. *
  321.        FCB 11          DEFINITIONS
  322.        FCC 'DEF'
  323.        FDB RBRAK-6     link to ]
  324. DEFS   JMP DOCOL
  325.        FDB CON7
  326.        FDB FTCH
  327.        FDB CUR7
  328.        FDB STO
  329.        FDB EXIT
  330. *
  331.        FCB 1           +
  332.        FCC '+  '
  333.        FDB DEFS-6      link to DEFINITIONS
  334. PLUS   LDX SP
  335.        LDA SP0,X
  336.        INCX
  337.        STA PH
  338.        LDA SP0,X
  339.        INCX
  340.        STX SP
  341.        INCX            point to low on stack
  342.        ADD SP0,X
  343.        STA SP0,X
  344.        LDX SP
  345.        LDA PH
  346.        ADC SP0,X
  347.        STA SP0,X
  348.        JMP NEXT
  349. *
  350.        FCB 1           -
  351.        FCC '-  '
  352.        FDB PLUS-6      link to +
  353. MINUS  LDX SP
  354.        LDA SP0,X
  355.        INCX
  356.        STA PH
  357.        LDA SP0,X
  358.        INCX
  359.        STA PL
  360.        STX SP
  361.        INCX            point to low on stack
  362.        LDA SP0,X
  363.        SUB PL
  364.        STA SP0,X
  365.        LDX SP
  366.        LDA SP0,X
  367.        SBC PH
  368.        STA SP0,X
  369.        JMP NEXT
  370. *
  371.        FCB 2           U*
  372.        FCC 'U* '
  373.        FDB MINUS-6     link to -
  374. UMULT  LDX SP
  375.        LDA SP0,X
  376.        INCX
  377.        STA PH
  378.        LDA SP0,X
  379.        INCX
  380.        STA PL
  381.        LDA SP0,X
  382.        INCX
  383.        STA QH
  384.        LDA SP0,X
  385.        STA QL
  386.        STX XTEMP
  387.        JSR MPY16
  388.        LDX XTEMP
  389.        LDA QL              push low word
  390.        STA SP0,X
  391.        LDA QH
  392.        DECX
  393.        STA SP0,X
  394.        LDA TEMPB           push high word
  395.        DECX
  396.        STA SP0,X
  397.        LDA TEMPA
  398.        DECX
  399.        STA SP0,X
  400.        STX SP
  401.        JMP NEXT
  402. *
  403. SEC    EQU PH
  404. *
  405. DIV16  LDA SEC+2          Dividend: (H to L)
  406.        LDX SEC            PL,PH,TEMPB,TEMPA
  407.        STX SEC+2          (SEC +1,+0,+3,+2)
  408.        LSLA
  409.        STA SEC
  410.        LDA SEC+3          Divisor is QH,QL
  411.        LDX SEC+1
  412.        STX SEC+3
  413.        ROLA
  414.        STA SEC+1
  415.        LDA #$10
  416.        STA TEMP
  417. DBEG   ROL SEC+2
  418.        ROL SEC+3
  419.        LDA SEC+2
  420.        SUB QL
  421.        TAX
  422.        LDA SEC+3
  423.        SBC QH
  424.        BCS DSKIP
  425.        STX SEC+2
  426.        STA SEC+3
  427.        SEC
  428.        BRA DSKIP+1
  429. DSKIP  CLC
  430.        ROL SEC        Quotient (H,L) is
  431.        ROL SEC+1         SEC+1,SEC
  432.        DEC TEMP       Remainder (H,L) is
  433.        BNE DBEG          SEC+3,SEC+2
  434.        RTS
  435. *
  436.        FCB 5           U/MOD
  437.        FCC 'U/M'
  438.        FDB UMULT-6     link to U*
  439. UDMD   LDX SP
  440.        LDA SP0,X
  441.        INCX
  442.        STA QH          divisor to Q
  443.        LDA SP0,X
  444.        INCX
  445.        STA QL
  446.        LDA SP0,X
  447.        INCX
  448.        STA SEC+1          high word to P
  449.        LDA SP0,X          (SEC +1, +0)
  450.        INCX
  451.        STA SEC
  452.        LDA SP0,X
  453.        INCX
  454.        STA SEC+3        low word to TEMPA/B
  455.        LDA SP0,X        (SEC +3, +2)
  456.        STA SEC+2
  457.        STX SP
  458.        BSR DIV16
  459.        LDX SP
  460.        LDA SEC+2        push remainder
  461.        STA SP0,X        (HL: SEC+3, +2)
  462.        LDA SEC+3
  463.        DECX
  464.        STA SP0,X
  465.        LDA SEC           push quotient
  466.        DECX              (HL: SEC+1, +0)
  467.        STA SP0,X
  468.        LDA SEC+1
  469.        DECX
  470.        STA SP0,X
  471.        STX SP
  472.        JMP NEXT
  473. *
  474.        FCB 4           S->D
  475.        FCC 'S->'
  476.        FDB UDMD-6      link to U/MOD
  477. STOD   LDX SP
  478.        LDA SP0,X
  479.        TSTA
  480.        BPL SPOS
  481.        LDA #$FF
  482.        BRA SEXIT
  483. SPOS   CLRA
  484. SEXIT  DECX
  485.        STA SP0,X
  486.        DECX
  487.        STA SP0,X
  488.        STX SP
  489.        JMP NEXT
  490. *
  491.        FCB 3           PAD
  492.        FCC 'PAD'
  493.        FDB STOD-6      link to S->D
  494. PAD    JMP DOCOL
  495.        FDB HERE
  496.        FDB LIT3
  497.        FDB $0044
  498.        FDB PLUS
  499.        FDB EXIT
  500. *
  501.        FCB 2           <#
  502.        FCC '<# '
  503.        FDB PAD-6       link to PAD
  504. LSHP   JMP DOCOL
  505.        FDB PAD
  506.        FDB HLD3
  507.        FDB STO
  508.        FDB EXIT
  509. *
  510.        FCB 4           OVER
  511.        FCC 'OVE'
  512.        FDB LSHP-6      link to <#
  513. OVER   LDX SP
  514.        INCX
  515.        INCX
  516.        LDA SP0,X
  517.        INCX
  518.        STA ATEMP
  519.        LDA SP0,X
  520.        LDX SP
  521.        DECX
  522.        STA SP0,X
  523.        LDA ATEMP
  524.        DECX
  525.        STA SP0,X
  526.        STX SP
  527.        JMP NEXT
  528. *
  529.        FCB 2           #>
  530.        FCC '#> '
  531.        FDB OVER-6      link to OVER
  532. SPGR   JMP DOCOL
  533.        FDB DROP
  534.        FDB DROP
  535.        FDB HLD3
  536.        FDB FTCH
  537.        FDB PAD
  538.        FDB OVER
  539.        FDB MINUS
  540.        FDB EXIT
  541. *
  542.        FCB 2           >R
  543.        FCC '>R '
  544.        FDB SPGR-6      link to #>
  545. TOR    LDX SP
  546.        LDA SP0,X
  547.        INCX
  548.        STA ATEMP
  549.        LDA SP0,X
  550.        INCX
  551.        STX SP
  552.        LDX RP
  553.        DECX
  554.        STA RP0,X
  555.        LDA ATEMP
  556.        DECX
  557.        STA RP0,X
  558.        STX RP
  559.        JMP NEXT
  560. *
  561.        FCB 2           R>
  562.        FCC 'R> '
  563.        FDB TOR-6       link to >R
  564. RTO    LDX RP
  565.        LDA RP0,X
  566.        INCX
  567.        STA ATEMP
  568.        LDA RP0,X
  569.        INCX
  570.        STX RP
  571.        LDX SP
  572.        DECX
  573.        STA SP0,X
  574.        LDA ATEMP
  575.        DECX
  576.        STA SP0,X
  577.        STX SP
  578.        JMP NEXT
  579. *
  580.        FCB 2           R@
  581.        FCC 'R@ '
  582.        FDB RTO-6       link to R>
  583. RFTCH  LDX RP
  584.        LDA RP0,X       pop high
  585.        INCX
  586.        STA ATEMP
  587.        LDA RP0,X       pop low
  588.        LDX SP
  589.        DECX
  590.        STA SP0,X       push low
  591.        LDA ATEMP
  592.        DECX
  593.        STA SP0,X       push high
  594.        STX SP
  595.        JMP NEXT
  596. *
  597.        FCB 3           ROT
  598.        FCC 'ROT'
  599.        FDB RFTCH-6     link to R@
  600. ROT    JMP DOCOL
  601.        FDB TOR
  602.        FDB SWAP
  603.        FDB RTO
  604.        FDB SWAP
  605.        FDB EXIT
  606. *
  607.        FCB 4           HOLD
  608.        FCC 'HOL'
  609.        FDB ROT-6       link to ROT
  610. HOLD   JMP DOCOL
  611.        FDB LIT3
  612.        FDB $FFFF        ( -1 )
  613.        FDB HLD3
  614.        FDB PLSTO
  615.        FDB HLD3
  616.        FDB FTCH
  617.        FDB CSTO
  618.        FDB EXIT
  619. *
  620.        FCB 5           M/MOD
  621.        FCC 'M/M'
  622.        FDB HOLD-6      link to HOLD
  623. MDM5   JMP DOCOL
  624.        FDB TOR
  625.        FDB ZERO
  626.        FDB RFTCH
  627.        FDB UDMD
  628.        FDB RTO
  629.        FDB SWAP
  630.        FDB TOR
  631.        FDB UDMD
  632.        FDB RTO
  633.        FDB EXIT
  634. *
  635.        FCB 4           BASE
  636.        FCC 'BAS'
  637.        FDB MDM5-6      link to M/MOD
  638. BAS4   JMP DOCOL
  639.        FDB LIT3
  640.        FDB BASE
  641.        FDB EXIT
  642. *
  643.        FCB 6           SMUDGE
  644.        FCC 'SMU'
  645.        FDB BAS4-6      link to BASE
  646. SMUDG  JMP DOCOL
  647.        FDB LAT6
  648.        FDB LIT3
  649.        FDB $0020
  650.        FDB TOG6
  651.        FDB EXIT
  652. *
  653.        FCB 3           ABS
  654.        FCC 'ABS'
  655.        FDB SMUDG-6     link to SMUDGE
  656. ABS    LDX SP
  657.        LDA SP0,X
  658.        TSTA
  659.        BPL ABXIT
  660.        COMA
  661.        STA SP0,X
  662.        INCX
  663.        LDA SP0,X
  664.        NEGA
  665.        STA SP0,X
  666. ABXIT  JMP NEXT
  667. *
  668.        FCB 2           0<
  669.        FCC '0< '
  670.        FDB ABS-6       link to ABS
  671. ZLESS  LDX SP
  672.        LDA SP0,X
  673.        TSTA
  674.        BPL ZLPOS
  675.        LDA #$FF
  676.        BRA ZLXIT
  677. ZLPOS  CLRA
  678. ZLXIT  STA SP0,X
  679.        INCX
  680.        STA SP0,X
  681.        JMP NEXT
  682. *
  683.        FCB 2           0=
  684.        FCC '0= '
  685.        FDB ZLESS-6     link to 0<
  686. ZEQ    LDX SP
  687.        LDA SP0,X
  688.        INCX
  689.        ORA SP0,X
  690.        BNE ZEN
  691.        LDA #$FF
  692.        BRA ZEXIT
  693. ZEN    CLRA
  694. ZEXIT  STA SP0,X
  695.        DECX
  696.        STA SP0,X
  697.        JMP NEXT
  698. *
  699.        FCB 1           <
  700.        FCC '<  '
  701.        FDB ZEQ-6       link to 0=
  702. LESS   JMP DOCOL
  703.        FDB MINUS
  704.        FDB ZLESS
  705.        FDB EXIT
  706. *
  707.        FCB 1           >
  708.        FCC '>  '
  709.        FDB LESS-6      link to <
  710. GREAT  JMP DOCOL
  711.        FDB SWAP
  712.        FDB LESS
  713.        FDB EXIT
  714. *
  715.        FCB 1           =
  716.        FCC '=  '
  717.        FDB GREAT-6     link to >
  718. EQUAL  JMP DOCOL
  719.        FDB MINUS
  720.        FDB ZEQ
  721.        FDB EXIT
  722. *
  723.        FCB 4           SIGN
  724.        FCC 'SIG'
  725.        FDB EQUAL-6     link to =
  726. SIGN   JMP DOCOL
  727.        FDB ZLESS
  728.        FDB ZBRAN
  729.        FDB $0008
  730.        FDB LIT3
  731.        FDB $002D
  732.        FDB HOLD
  733.        FDB EXIT
  734. *
  735.        FCB 6           NEGATE
  736.        FCC 'NEG'
  737.        FDB SIGN-6      link to SIGN
  738. NEG6   LDX SP
  739.        LDA SP0,X
  740.        COMA
  741.        STA SP0,X
  742.        INCX
  743.        LDA SP0,X
  744.        NEGA
  745.        STA SP0,X
  746.        JMP NEXT
  747. *
  748.        FCB 2           +-
  749.        FCC '+- '
  750.        FDB NEG6-6      link to NEGATE
  751. PLMI   JMP DOCOL
  752.        FDB ZLESS
  753.        FDB ZBRAN
  754.        FDB $0004
  755.        FDB NEG6
  756.        FDB EXIT
  757. *
  758.        FCB 1           #
  759.        FCC '#  '
  760.        FDB PLMI-6      link to +-
  761. SHARP  JMP DOCOL
  762.        FDB BAS4
  763.        FDB CFCH
  764.        FDB MDM5
  765.        FDB ROT
  766.        FDB LIT3
  767.        FDB $0009
  768.        FDB OVER
  769.        FDB LESS
  770.        FDB ZBRAN
  771.        FDB $0008
  772.        FDB LIT3
  773.        FDB $0007
  774.        FDB PLUS
  775.        FDB LIT3
  776.        FDB $0030
  777.        FDB PLUS
  778.        FDB HOLD
  779.        FDB EXIT
  780. *
  781.        FCB 2           OR
  782.        FCC 'OR '
  783.        FDB SHARP-6     link to #
  784. OR2    LDX SP
  785.        LDA SP0,X
  786.        INCX
  787.        INCX
  788.        ORA SP0,X
  789.        STA SP0,X
  790.        DECX
  791.        LDA SP0,X
  792.        INCX
  793.        INCX
  794.        ORA SP0,X
  795.        STA SP0,X
  796.        DECX
  797.        STX SP
  798.        JMP NEXT
  799. *
  800.        FCB 3           AND
  801.        FCC 'AND'
  802.        FDB OR2-6       link to OR
  803. AND3   LDX SP
  804.        LDA SP0,X
  805.        INCX
  806.        INCX
  807.        AND SP0,X
  808.        STA SP0,X
  809.        DECX
  810.        LDA SP0,X
  811.        INCX
  812.        INCX
  813.        AND SP0,X
  814.        STA SP0,X
  815.        DECX
  816.        STX SP
  817.        JMP NEXT
  818. *
  819.        FCB 3           XOR
  820.        FCC 'XOR'
  821.        FDB AND3-6     link to AND
  822. XOR3   LDX SP
  823.        LDA SP0,X
  824.        INCX
  825.        INCX
  826.        EOR SP0,X
  827.        STA SP0,X
  828.        DECX
  829.        LDA SP0,X
  830.        INCX
  831.        INCX
  832.        EOR SP0,X
  833.        STA SP0,X
  834.        DECX
  835.        STX SP
  836.        JMP NEXT
  837. *
  838.        FCB 4           DDUP
  839.        FCC 'DDU'
  840.        FDB XOR3-6      link to XOR
  841. DDUP   JMP DOCOL
  842.        FDB OVER
  843.        FDB OVER
  844.        FDB EXIT
  845. *
  846.        FCB 2           #S
  847.        FCC '#S '
  848.        FDB DDUP-6      link to DDUP
  849. SHRPS  JMP DOCOL
  850.        FDB SHARP
  851.        FDB DDUP
  852.        FDB OR2
  853.        FDB ZEQ
  854.        FDB ZBRAN
  855.        FDB $FFF6
  856.        FDB EXIT
  857. *
  858.        FCB 1           .
  859.        FCC '.  '
  860.        FDB SHRPS-6     link to #S
  861. DOT    JMP DOCOL
  862.        FDB DUP3
  863.        FDB DUP3
  864.        FDB ABS
  865.        FDB STOD
  866.        FDB LSHP
  867.        FDB SHRPS
  868.        FDB ROT
  869.        FDB SIGN
  870.        FDB SPGR
  871.        FDB TYPE
  872.        FDB DROP
  873.        FDB BL2
  874.        FDB EMIT
  875.        FDB EXIT
  876. *
  877.        FCB 7           COMPILE
  878.        FCC 'COM'
  879.        FDB DOT-6      link to .
  880. COMP   JMP DOCOL
  881.        FDB RTO
  882.        FDB DUP3
  883.        FDB TWOP
  884.        FDB TOR
  885.        FDB FTCH
  886.        FDB COMA
  887.        FDB EXIT
  888. *
  889.        FCB $81         ;  (IMMEDIATE)
  890.        FCC ';  '
  891.        FDB COMP-6      link to COMPILE
  892. SEMI   JMP DOCOL
  893.        FDB COMP
  894.        FDB EXIT
  895.        FDB SMUDG
  896.        FDB LBRAK
  897.        FDB EXIT
  898. *
  899.        FCB 1           :
  900.        FCC ':  '
  901.        FDB SEMI-6      link to ;
  902. COLON  JMP DOCOL
  903.        FDB CUR7
  904.        FDB FTCH
  905.        FDB CON7
  906.        FDB STO
  907.        FDB CRE6
  908.        FDB SMUDG
  909.        FDB COMP
  910.        JMP DOCOL
  911.        FDB RBRAK
  912.        FDB EXIT
  913. *
  914.        FCB $81         '  (IMMEDIATE)
  915.        FCB $27
  916.        FCC '  '
  917.        FDB COLON-6     link to :
  918. TICK   JMP DOCOL
  919.        FDB DFND
  920.        FDB ZBRAN
  921.        FDB $0006
  922.        FDB DROP
  923.        FDB EXIT
  924.        FDB QUES
  925. *
  926. DOVAR  LDX SP
  927.        LDA NEXT1+2      low byte of W
  928.        ADD #3
  929.        DECX
  930.        STA SP0,X
  931.        LDA NEXT1+1      high byte of W
  932.        ADC #0
  933.        DECX
  934.        STA SP0,X
  935.        STX SP
  936.        JMP NEXT
  937. *
  938.        FCB 8           VARIABLE
  939.        FCC 'VAR'
  940.        FDB TICK-6      link to '
  941. VAR8   JMP DOCOL
  942.        FDB CRE6
  943.        FDB LIT3        compile a jump
  944.        FDB $00CC       to DOVAR
  945.        FDB CCOMA
  946.        FDB COMP
  947.        FDB DOVAR
  948.        FDB TWO
  949.        FDB ALL5
  950.        FDB EXIT
  951. *
  952. DOCON  LDA NEXT1+2      put W+2 into GET
  953.        ADD #3
  954.        STA GET+2
  955.        LDA NEXT1+1
  956.        ADC #0
  957.        STA GET+1
  958.        LDX #1
  959.        JSR GET         get low byte of constant
  960.        LDX SP
  961.        DECX
  962.        STA SP0,X
  963.        STX SP
  964.        CLRX
  965.        JSR GET         then the high byte
  966.        LDX SP
  967.        DECX
  968.        STA SP0,X
  969.        STX SP
  970.        JMP NEXT
  971. *
  972.        FCB 8           CONSTANT
  973.        FCC 'CON'
  974.        FDB VAR8-6      link to VARIABLE
  975. CON8   JMP DOCOL
  976.        FDB CRE6
  977.        FDB LIT3        compile a jump to DOCON
  978.        FDB $00CC
  979.        FDB CCOMA
  980.        FDB COMP
  981.        FDB DOCON
  982.        FDB COMA
  983.        FDB EXIT
  984. *
  985.        FCB 1           *
  986.        FCC '*  '
  987.        FDB CON8-6      link to CONSTANT
  988. MULT   JMP DOCOL
  989.        FDB UMULT
  990.        FDB DROP
  991.        FDB EXIT
  992. *
  993.        FCB $89          [COMPILE]   IMMEDIATE
  994.        FCC '[CO'
  995.        FDB MULT-6       link to *
  996. BCOM9  JMP DOCOL
  997.        FDB TICK
  998.        FDB COMA
  999.        FDB EXIT
  1000. *
  1001.        FCB $85           BEGIN      IMMEDIATE
  1002.        FCC 'BEG'
  1003.        FDB BCOM9-6       link to [COMPILE]
  1004. BEGN   JMP DOCOL
  1005.        FDB HERE
  1006.        FDB EXIT
  1007. *
  1008.        FCB $85           AGAIN       IMMEDIATE
  1009.        FCC 'AGA'
  1010.        FDB BEGN-6        link to BEGIN
  1011. AGAIN  JMP DOCOL
  1012.        FDB COMP
  1013.        FDB BRAN
  1014.        FDB HERE
  1015.        FDB MINUS
  1016.        FDB COMA
  1017.        FDB EXIT
  1018. *
  1019.        FCB $85            UNTIL      IMMEDIATE
  1020.        FCC 'UNT'
  1021.        FDB AGAIN-6        link to AGAIN
  1022. UNTIL  JMP DOCOL
  1023.        FDB COMP
  1024.        FDB ZBRAN
  1025.        FDB HERE
  1026.        FDB MINUS
  1027.        FDB COMA
  1028.        FDB EXIT
  1029. *
  1030.        FCB $82             IF         IMMEDIATE
  1031.        FCC 'IF '
  1032.        FDB UNTIL-6         link to UNTIL
  1033. IF2    JMP DOCOL
  1034.        FDB COMP
  1035.        FDB ZBRAN
  1036.        FDB HERE
  1037.        FDB ZERO
  1038.        FDB COMA
  1039.        FDB EXIT
  1040. *
  1041.        FCB $84              THEN       IMMEDIATE
  1042.        FCC 'THE'
  1043.        FDB IF2-6            link to IF
  1044. THEN   JMP DOCOL
  1045.        FDB HERE
  1046.        FDB OVER
  1047.        FDB MINUS
  1048.        FDB SWAP
  1049.        FDB STO
  1050.        FDB EXIT
  1051. *
  1052.        FCB $84              ELSE        IMMEDIATE
  1053.        FCC 'ELS'
  1054.        FDB THEN-6           link to THEN
  1055. ELSE   JMP DOCOL
  1056.        FDB COMP
  1057.        FDB BRAN
  1058.        FDB HERE
  1059.        FDB ZERO
  1060.        FDB COMA
  1061.        FDB SWAP
  1062.        FDB THEN
  1063.        FDB EXIT
  1064. *
  1065.        FCB $85               WHILE       IMMEDIATE
  1066.        FCC 'WHI'
  1067.        FDB ELSE-6            link to ELSE
  1068. WHILE  JMP DOCOL
  1069.        FDB IF2
  1070.        FDB EXIT
  1071. *
  1072.        FCB $86                REPEAT     IMMEDIATE
  1073.        FCC 'REP'
  1074.        FDB WHILE-6            link to WHILE
  1075. REPET  JMP DOCOL
  1076.        FDB TOR
  1077.        FDB AGAIN
  1078.        FDB RTO
  1079.        FDB THEN
  1080.        FDB EXIT
  1081. *
  1082.        FCB 4                    <.">
  1083.        FCC '<."'
  1084.        FDB REPET-6               link to REPEAT
  1085. BDOTQ  JMP DOCOL
  1086.        FDB RFTCH
  1087.        FDB COU5
  1088.        FDB DUP3
  1089.        FDB ONEP
  1090.        FDB RTO
  1091.        FDB PLUS
  1092.        FDB TOR
  1093.        FDB TYPE
  1094.        FDB EXIT
  1095. *
  1096.        FCB 3                    TIB
  1097.        FCC 'TIB'
  1098.        FDB BDOTQ-6              link to <.">
  1099. TIB3   JMP DOCOL
  1100.        FDB LIT3
  1101.        FDB TIB
  1102.        FDB EXIT
  1103. *
  1104.        FCB 3                    >IN
  1105.        FCC '>IN'
  1106.        FDB TIB3-6               link to TIB
  1107. FRIN   JMP DOCOL
  1108.        FDB LIT3
  1109.        FDB IN
  1110.        FDB EXIT
  1111. *
  1112.        FCB 7                    'STREAM
  1113.        FCB $27
  1114.        FCC 'ST'
  1115.        FDB FRIN-6               link to >IN
  1116. TSTRM  JMP DOCOL
  1117.        FDB TIB3
  1118.        FDB FRIN
  1119.        FDB CFCH
  1120.        FDB PLUS
  1121.        FDB EXIT
  1122. *
  1123.        FCB 4                     <DO>
  1124.        FCC '<DO'
  1125.        FDB TSTRM-6               link to 'STREAM
  1126. BDO    LDA #4
  1127.        STA COUNTR
  1128.        ADD SP                    make 2 artificial pops
  1129.        STA SP
  1130. DOAGIN LDX SP                    move limit
  1131.        DECX                      then index
  1132.        LDA SP0,X                 from SP
  1133.        STX SP                    to RP
  1134.        LDX RP
  1135.        DECX
  1136.        STA RP0,X
  1137.        STX RP
  1138.        DEC COUNTR
  1139.        BNE DOAGIN
  1140.        LDA #4                    adjust SP
  1141.        ADD SP
  1142.        STA SP
  1143.        JMP NEXT
  1144. *
  1145.        FCB 6                     <LOOP>
  1146.        FCC '<LO'
  1147.        FDB BDO-6                 link to <DO>
  1148. BLOP   CLR PH                  set increment to 1
  1149.        LDA #1
  1150.        STA PL
  1151. LOOPS  LDX RP                  increment index
  1152.        INCX                    by value
  1153.        LDA PL                  in P H/L
  1154.        ADD RP0,X
  1155.        STA RP0,X
  1156.        DECX
  1157.        LDA PH
  1158.        ADC RP0,X
  1159.        STA RP0,X
  1160.        INCX
  1161.        LDA RP0,X              test index-limit
  1162.        INCX
  1163.        INCX
  1164.        SUB RP0,X
  1165.        LDX RP
  1166.        LDA RP0,X
  1167.        INCX
  1168.        INCX
  1169.        SBC RP0,X
  1170.        EOR PH            also check increment sign
  1171.        BMI LAGIN         loop again if negative
  1172.        INCX
  1173.        INCX
  1174.        STX RP
  1175.        JMP ZBREX
  1176. LAGIN  JMP BRAN
  1177. *
  1178.        FCB 7                <+LOOP>
  1179.        FCC '<+L'
  1180.        FDB BLOP-6           link to <LOOP>
  1181. BPLOP  LDX SP
  1182.        LDA SP0,X
  1183.        INCX
  1184.        STA PH              set increment
  1185.        LDA SP0,X           from the stack
  1186.        INCX
  1187.        STA PL
  1188.        STX SP
  1189.        BRA LOOPS
  1190. *
  1191.        FCB $82              DO          IMMEDIATE
  1192.        FCC 'DO '
  1193.        FDB BPLOP-6           link to <+LOOP>
  1194. DO     JMP DOCOL
  1195.        FDB COMP
  1196.        FDB BDO
  1197.        FDB HERE
  1198.        FDB EXIT
  1199. *
  1200.        FCB $84              LOOP         IMMEDIATE
  1201.        FCC 'LOO'
  1202.        FDB DO-6             link to DO
  1203. LOOP   JMP DOCOL
  1204.        FDB COMP
  1205.        FDB BLOP
  1206.        FDB HERE
  1207.        FDB MINUS
  1208.        FDB COMA
  1209.        FDB EXIT
  1210. *
  1211.        FCB $85              +LOOP         IMMEDIATE
  1212.        FCC '+LO'
  1213.        FDB LOOP-6           link to LOOP
  1214. PLOOP  JMP DOCOL
  1215.        FDB COMP
  1216.        FDB BPLOP
  1217.        FDB HERE
  1218.        FDB MINUS
  1219.        FDB COMA
  1220.        FDB EXIT
  1221. *
  1222.        FCB 7                DNEGATE
  1223.        FCC 'DNE'
  1224.        FDB PLOOP-6          link to +LOOP
  1225. DNEG7  LDA #3
  1226.        STA COUNTR
  1227.        LDX SP
  1228. DNLP   LDA SP0,X            ones complement
  1229.        COMA                 three bytes
  1230.        STA SP0,X
  1231.        INCX
  1232.        DEC COUNTR
  1233.        BNE DNLP
  1234.        LDA SP0,X            twos complement
  1235.        NEGA                 the fourth
  1236.        STA SP0,X
  1237.        JMP NEXT
  1238. *
  1239.        FCB $81              I   IMMEDIATE
  1240.        FCC 'I  '
  1241.        FDB DNEG7-6          link to DNEGATE
  1242. I1     JMP DOCOL
  1243.        FDB COMP
  1244.        FDB RFTCH
  1245.        FDB EXIT
  1246. *
  1247. *
  1248. *
  1249. *
  1250.          END
  1251. ***************************************************************** 
  1252. *     RAFOS FORTH V1.0       26 March  1986                     *
  1253. *    -- ROM #1 of 2                                             *
  1254. *                                                               * 
  1255. *  (C) Copyright 1986, Everett Carter. All rights reserved.     * 
  1256. *                                                               * 
  1257. *  This FORTH is a subset of the FORTH-79 standard.             * 
  1258. *  Some changes have been made in order to save on              * 
  1259. *  space in the limited memory of the float.                    * 
  1260. *                                                               * 
  1261. ***************************************************************** 
  1262. *
  1263. *     EQUATES FOR ROM 2
  1264. QUES     EQU    $1000
  1265. *
  1266. TOG6     EQU    $105F          TOGGLE
  1267. IMM9     EQU    $1089          IMMEDIATE
  1268. DFND     EQU    $109B          -FIND
  1269. COU5     EQU    $10B1          COUNT
  1270. ZERO     EQU    $10C3          0
  1271. ONE      EQU    $10D8          1
  1272. TWO      EQU    $10EF          2
  1273. TWOP     EQU    $1106          2+
  1274. LBRAK    EQU    $1121          [
  1275. RBRAK    EQU    $1131          ]
  1276. DEFS     EQU    $1143          DEFINITIONS
  1277. PLUS     EQU    $1155          +
  1278. MINUS    EQU    $117C          -
  1279. UMULT    EQU    $11A7          U*
  1280. *
  1281. PAD      EQU    $1289          PAD
  1282. LSHP     EQU    $129B          <#
  1283. OVER     EQU    $12AB          OVER
  1284. SPGR     EQU    $12CE          #>
  1285. TOR      EQU    $12E6          >R
  1286. RTO      EQU    $130A          R>
  1287. RFTCH    EQU    $132E          R@
  1288. ROT      EQU    $134F          ROT
  1289. HOLD     EQU    $1361          HOLD
  1290. *
  1291. COMP     EQU    $1557          COMPILE
  1292. SEMI     EQU    $156D          ;
  1293. COLON    EQU    $157F          :
  1294. TICK     EQU    $159B          '
  1295. VAR8     EQU    $15C5          VARIABLE
  1296. *
  1297. I1       EQU    $17EE          I
  1298. LATEST EQU I1-6                Last Dictionary entry
  1299. *
  1300. ROM      EQU    $1800        ROM #1 start address
  1301. *
  1302. CR       EQU    $0D          CARRIAGE RETURN
  1303. LF       EQU    $0A          LINE FEED
  1304. BL       EQU    $20          BLANK
  1305. BS       EQU    $08          Back Space
  1306. DEL      EQU    $7F          Delete
  1307. DDR      EQU    4            DATA DIRECTION REGISTER OFFSET 
  1308. PORTA    EQU    0            I/O PORT 0 
  1309. PORTB    EQU    1            I/O PORT 1 
  1310. PUT      EQU    PORTB        SERIAL I/O PORT
  1311. *
  1312. INITSP   EQU    $7F          INITIAL STACK POINTER VALUE
  1313. STACK    EQU    INITSP-5     TOP OF STACK 
  1314. MEMSIZ   EQU    $2000        MEMORY ADDRESS SPACE SIZE
  1315. SP0      EQU    $0F00 
  1316. RP0      EQU    $0E00 
  1317. TIB      EQU    $0D80 
  1318. *     RAM VARIABLES 
  1319. *        ORG    $10          ON-CHIP RAM (112 BYTES)
  1320. ATEMP    EQU    $10          TEMP USED IN PUTDEC
  1321. XTEMP    EQU    $11          INDEX TEMPORARY
  1322. GETR     EQU    $12          PICK & DROP TEMPORARY
  1323. COUNT    EQU    $16          NUMBER OF BITS LEFT TO get/send
  1324. CHAR     EQU    $17          Current input/output character 
  1325. BYTCNT   EQU    $1E          bytcnt.
  1326. WTIME    EQU    $20          TIMER INTERRUPT FROM WAIT STATE
  1327. *
  1328. *
  1329. PH       EQU $21          MISC SCRATCH AREAS 
  1330. PL       EQU $22 
  1331. TEMPA    EQU $23 
  1332. TEMPB    EQU $24
  1333. QH       EQU $25
  1334. QL       EQU $26
  1335. TEMP     EQU $27
  1336. TERM     EQU $28
  1337. *
  1338.          ORG $0029
  1339. *
  1340. IN       FCB #0              Where FORTH will look for input
  1341. OUT      FCB #0
  1342. COUNTR   FCB #0
  1343. DP       FDB #$01D0          The initial Dictionary pointer
  1344. START    FDB #0              The start up vector
  1345. *
  1346. *
  1347. IP       FDB #0              THE FORTH INSTRUCTION POINTER
  1348. RP       FCB #0              THE RETURN POINTER OFFSET
  1349. SP       FCB #0              THE STACK POINTER OFFSET
  1350. BASE     FCB #$10
  1351. *
  1352. USER     EQU *               The space for USER variables
  1353. FENCE    EQU 0               USER + 0
  1354.          FDB #0                            INITIALIZE USER VARS
  1355. STATE    EQU 2               USER + 2
  1356.          FDB #0
  1357. FORTH    EQU 4               USER + 4
  1358.          FDB #0
  1359. CONTEXT  EQU 6               USER + 6
  1360.          FDB USER+FORTH
  1361. CURRENT  EQU 8               USER + 8
  1362.          FDB USER+FORTH
  1363. HLD      EQU $0A             USER + $0A
  1364.          FDB #0
  1365. *
  1366.        ORG $0080
  1367. *
  1368. *          The start of the INNER interpreter 
  1369. *
  1370. DOCOL  LDX RP                            * Push IP to RS
  1371. *
  1372. DOCOL1 EQU DOCOL
  1373. *
  1374.        DECX 
  1375.        LDA IP+1 
  1376.        STA RP0,X 
  1377.        DECX 
  1378.        LDA IP 
  1379.        STA RP0,X 
  1380.        STX RP 
  1381.        LDA NEXT1+2
  1382.        ADD #2
  1383.        STA IP+1 
  1384.        LDA NEXT1+1
  1385.        ADC #0
  1386.        STA IP 
  1387. *
  1388. *      fall thru to NEXT
  1389. *
  1390. NEXT   LDA IP+1                   NEXT The Inner Interpreter 
  1391.        STA CA+2                   SELF-MODIFYING
  1392.        LDA IP 
  1393.        STA CA+1 
  1394. CA     LDA SP0                   -- SP0 is a dummy
  1395.        STA NEXT1+1
  1396.        LDA IP+1 
  1397.        ADD #1
  1398.        STA CA2+2
  1399.        LDA IP 
  1400.        ADC #0
  1401.        STA CA2+1
  1402. CA2    LDA SP0                     -- SP0 is a dummy
  1403.        STA NEXT1+2
  1404.        LDA IP+1 
  1405.        ADD #2
  1406.        STA IP+1 
  1407.        LDA IP 
  1408.        ADC #0
  1409.        STA IP 
  1410. NEXT1  JMP COLD                    -- COLD is a dummy
  1411. *
  1412. *       SELF MODIFYING CODE FIRST
  1413. *
  1414. LOAD     STA SP0,X                       STA (HERE),X
  1415.          RTS                             move A to HERE+X
  1416. *
  1417. GET      LDA SP0,X                       LDA (HERE),X
  1418.          RTS                             get HERE+X into A
  1419. *
  1420.        FCB 4                  TYPE  -- SELF MODIFYING
  1421.        FCC 'TYP'
  1422.        FDB #0                 end link
  1423. TYPE   LDX SP
  1424.        INCX                   Drop high byte
  1425.        LDA SP0,X
  1426.        INCX
  1427.        STA COUNTR             COUNTR = byte count
  1428.        LDA SP0,X
  1429.        INCX
  1430.        STA TYSCR+1
  1431.        LDA SP0,X
  1432.        INCX
  1433.        STA TYSCR+2
  1434.        STX SP
  1435.        CLR OUT
  1436.        TST COUNTR
  1437.        BEQ TXIT
  1438. TLOOP  LDX OUT
  1439. TYSCR  LDA SP0,X          -- SP0 is a dummy
  1440.        JSR OUTCHAR
  1441.        INC OUT
  1442.        LDA OUT
  1443.        SUB COUNTR
  1444.        BMI TLOOP
  1445. TXIT   JMP NEXT
  1446. *
  1447. *
  1448.        FCB 6               <FIND> -- SELF MODIFYING
  1449.        FCC '<FI'
  1450.        FDB TYPE-6          link to TYPE
  1451. FIN6   LDX SP
  1452.        LDA SP0,X           get addr1 high
  1453.        INCX
  1454.        STA GET+1
  1455.        LDA SP0,X           addr1 low
  1456.        INCX
  1457.        STA GET+2
  1458.        LDA SP0,X           get addr2 high
  1459.        INCX
  1460.        STA FINSCR+1
  1461.        STA FINCNT+1
  1462.        LDA SP0,X
  1463.        INCX
  1464.        STA FINSCR+2
  1465.        STA FINCNT+2
  1466.        STX SP
  1467. FINCNT LDA SP0             -- SP0 is a dummy
  1468.        STA COUNTR          save byte count
  1469.        TSTA                count = 0 ?
  1470.        BEQ NONE
  1471. FINLP1 CLRX
  1472. FINLP2 JSR GET
  1473.        AND #$7F             ignore bit 7
  1474. FINSCR CMP SP0,X            -- SP0 is a dummy
  1475.        BNE NFND
  1476.        CPX #3               X = 3 ? if so quit as FOUND
  1477.        BEQ FOUND
  1478.        CPX COUNTR           X = count ?
  1479.        BEQ FOUND
  1480.        INCX
  1481.        BRA FINLP2
  1482. NFND   LDX #4                Not found, go to next element
  1483.        JSR GET
  1484.        STA ATEMP
  1485.        INCX
  1486.        JSR GET
  1487.        ORA ATEMP             =0 ?
  1488.        BEQ NONE             if yes, end of list
  1489.        JSR GET              else move new pointer to get
  1490.        STA GET+2
  1491.        LDA ATEMP
  1492.        STA GET+1
  1493.        BRA FINLP1           and try again
  1494. NONE   LDX SP               nothing, push a FALSE to stack
  1495.        CLRA
  1496.        BRA FQUIT
  1497. FOUND  LDX SP
  1498.        LDA GET+2           push CA of found word
  1499.        ADD #6
  1500.        DECX
  1501.        STA SP0,X
  1502.        LDA GET+1
  1503.        ADC #0
  1504.        DECX
  1505.        STA SP0,X
  1506.        STX SP
  1507.        CLRX
  1508.        JSR GET             get the byte count and push it
  1509.        LDX SP
  1510.        DECX
  1511.        STA SP0,X
  1512.        CLRA
  1513.        DECX
  1514.        STA SP0,X
  1515.        LDA #$FF           push a TRUE flag
  1516. FQUIT  DECX
  1517.        STA SP0,X
  1518.        DECX
  1519.        STA SP0,X
  1520.        STX SP
  1521.        JMP NEXT
  1522. *
  1523.        FCB 4                  BRAN -- SELF MODIFYING
  1524.        FCC 'BRA'
  1525.        FDB  FIN6-6            link to <FIND>
  1526. BRAN   LDA IP
  1527.        STA BRSC1+1
  1528.        STA BRSC2+1
  1529.        LDA IP+1
  1530.        STA BRSC1+2
  1531.        STA BRSC2+2
  1532.        LDX #1
  1533. BRSC1  LDA SP0,X
  1534.        ADD IP+1
  1535.        STA IP+1
  1536.        CLRX
  1537. BRSC2  LDA SP0,X
  1538.        ADC IP
  1539.        STA IP
  1540.        JMP NEXT
  1541. *****************************************************************
  1542. *
  1543. *     NO SELF MODIFYING CODE BEYOND THIS POINT
  1544. *
  1545. OFFSET EQU *
  1546.        ORG ROM+OFFSET         *  ROM #2 ORIGIN
  1547. *
  1548. *
  1549.        FCB 7               0BRANCH
  1550.        FCC '0BR'
  1551.        FDB BRAN-6          link to BRAN
  1552. ZBRAN  LDX SP
  1553.        LDA SP0,X
  1554.        INCX
  1555.        ORA SP0,X
  1556.        INCX
  1557.        STX SP
  1558.        TSTA
  1559.        BNE ZBREX
  1560.        JMP BRAN
  1561. ZBREX  LDA IP+1            bump IP past offset
  1562.        ADD #2
  1563.        STA IP+1
  1564.        LDA IP
  1565.        ADC #0
  1566.        STA IP
  1567.        JMP NEXT
  1568. *
  1569.        FCB 4                    EXIT
  1570.        FCC 'EXI'
  1571.        FDB ZBRAN-6               link to 0BRANCH
  1572. EXIT   LDX RP                   Pop RS into IP
  1573.        LDA RP0,X                High byte
  1574.        INCX
  1575.        STA IP
  1576.        LDA RP0,X                then low byte
  1577.        INCX
  1578.        STA IP+1
  1579.        STX RP
  1580.        JMP NEXT
  1581. *
  1582.        FCB 7                    EXECUTE
  1583.        FCC 'EXE'
  1584.        FDB EXIT-6               link to EXIT
  1585. EXE7   LDX SP                   Pop SP into W (NEXT1+1)
  1586.        LDA SP0,X                First high byte
  1587.        INCX
  1588.        STA NEXT1+1
  1589.        LDA SP0,X        Then low byte
  1590.        INCX
  1591.        STA NEXT1+2
  1592.        STX SP
  1593.        JMP NEXT1
  1594. *
  1595. INLINE JSR CRLF
  1596.        LDA #BL
  1597.        CLR COUNTR
  1598.        CLRX                   Clear line buffer
  1599. INLP1  STA TIB,X
  1600.        INCX
  1601.        CPX #$7E               Buffer end ?
  1602.        BNE INLP1
  1603.        CLR IN
  1604.        CLRX                   Clear buffer pointer
  1605. INLP2  JSR GETCHAR            ( X = IN )
  1606.        CMP #DEL               = DELETE ?
  1607.        BNE INTST2             branch if not
  1608. INDEL  CPX #0
  1609.        BEQ INLP2              Skip if IN (LBP) = 0 already
  1610.        DECX
  1611.        LDA #BL                DELETE CHAR
  1612.        STA TIB,X
  1613.        LDA #BS
  1614.        JSR OUTCHAR
  1615.        LDA #BL
  1616.        JSR OUTCHAR
  1617.        LDA #BS
  1618.        JSR OUTCHAR
  1619.        BRA INLP2
  1620. INTST2 CMP #BS               maybe its a backspace
  1621.        BEQ INDEL
  1622.        CMP #CR               or a CR
  1623.        BEQ INEX
  1624.        STA TIB,X
  1625.        CPX #$7D
  1626.        BHS INSKP
  1627.        INCX
  1628. INSKP  JSR OUTCHAR
  1629.        BRA INLP2              Back to main loop
  1630. INEX   LDA #BL
  1631.        JSR OUTCHAR
  1632.        JMP NEXT
  1633. *
  1634.        FCB 4                  EMIT
  1635.        FCC 'EMI'
  1636.        FDB EXE7-6             link to EXECUTE
  1637. EMIT   LDX SP
  1638.        INCX                   drop high byte
  1639.        LDA SP0,X
  1640.        INCX
  1641.        STX SP
  1642.        JSR OUTCHAR
  1643.        JMP NEXT
  1644. *
  1645.        FCB 2               BL
  1646.        FCC 'BL '
  1647.        FDB EMIT-6          link to EMIT
  1648. BL2    LDX SP
  1649.        LDA #BL
  1650.        DECX
  1651.        STA SP0,X
  1652.        CLRA
  1653.        DECX
  1654.        STA SP0,X
  1655.        STX SP
  1656.        JMP NEXT
  1657. *
  1658.        FCB 4               WORD
  1659.        FCC 'WOR'
  1660.        FDB BL2-6           link to BL
  1661. WORD   LDA DP              start by setting up LOAD
  1662.        STA LOAD+1
  1663.        LDA DP+1
  1664.        STA LOAD+2
  1665.        CLR COUNTR
  1666.        CLRA
  1667.        CLRX
  1668.        JSR LOAD          clear DP
  1669.        LDX SP            get terminator
  1670.        INCX              drop high byte
  1671.        LDA SP0,X
  1672.        STA TERM
  1673.        INCX
  1674.        STX SP
  1675.        LDX IN            get INput pointer
  1676.        CMP #BL           seperator = space ?
  1677.        BNE TOK
  1678. IGNBL  LDA TIB,X         ignore blank
  1679.        CMP #BL
  1680.        BNE TOK
  1681.        INCX
  1682.        BRA IGNBL
  1683. TOK    INC COUNTR
  1684.        LDA TIB,X
  1685.        STX XTEMP          save X
  1686.        LDX COUNTR
  1687.        JSR LOAD          move char to DP + COUNTR
  1688.        LDX XTEMP          get X back
  1689.        INCX
  1690.        CMP #$80          character = buffer end ?
  1691.        BEQ WORXIT
  1692.        CMP TERM
  1693.        BNE TOK           continue unless terminator
  1694. WORXIT STX IN            save new value of IN
  1695.        LDA COUNTR        move count-1 to DP
  1696.        DECA
  1697.        CLRX
  1698.        JSR LOAD
  1699.        LDA DP+1          Push DP addr to stack
  1700.        LDX SP
  1701.        DECX
  1702.        STA SP0,X
  1703.        LDA DP
  1704.        DECX
  1705.        STA SP0,X
  1706.        STX SP
  1707.        JMP NEXT
  1708. *
  1709. MPY16  LDX #$10          16 bit X 16 bit multiply   32 bit result
  1710.        CLR TEMPA
  1711.        CLR TEMPB
  1712.        ROR QH
  1713.        ROR QL
  1714. MPYNXT BCC ROTAT
  1715.        LDA TEMPB
  1716.        ADD PL
  1717.        STA TEMPB
  1718.        LDA TEMPA
  1719.        ADC PH
  1720.        STA TEMPA
  1721. ROTAT  ROR TEMPA
  1722.        ROR TEMPB
  1723.        ROR QH
  1724.        ROR QL
  1725.        DECX
  1726.        BNE MPYNXT
  1727.        RTS
  1728. *
  1729.        FCB 8               <NUMBER>
  1730.        FCC '<NU'
  1731.        FDB WORD-6          link to WORD
  1732. NUM8   LDX SP              pop stack into GET
  1733.        LDA SP0,X
  1734.        INCX
  1735.        STA GET+1
  1736.        LDA SP0,X
  1737.        INCX
  1738.        STA GET+2
  1739.        STX SP
  1740.        CLRX                Put char count into COUNTR
  1741.        JSR GET
  1742.        STA COUNTR
  1743.        TSTA                count = 0 ?
  1744.        BEQ NOTNO
  1745.        INCX
  1746.        CLR TEMP           TEMP is the sign flag
  1747.        CLR QH
  1748.        CLR QL
  1749.        CLR PH              Set P = BASE
  1750.        LDA BASE
  1751.        STA PL
  1752.        JSR GET             Get first char
  1753.        CMP #$2D            = '-' ?
  1754.        BNE NUMSKP
  1755.        DEC TEMP            Minus flag = TRUE
  1756.        INCX                bump X
  1757.        CPX COUNTR          X > COUNTR ?
  1758.        BHI NOTNO
  1759.        JSR GET
  1760. NUMSKP INCX               at this point X points 1 past char in A
  1761.        SUB #$30
  1762.        BMI NOTNO          if negative, not a number
  1763.        CMP #$0A           less than 10 ?
  1764.        BMI NUMB
  1765.        CMP #$11           valid char?
  1766.        BMI NOTNO
  1767.        SUB #7
  1768. NUMB   CMP BASE           valid for this base ?
  1769.        BLO ANUMB
  1770. NOTNO  CLRA               NOPE, push a FALSE
  1771. NUMXT  LDX SP
  1772.        DECX
  1773.        STA SP0,X
  1774.        DECX
  1775.        STA SP0,X
  1776.        STX SP
  1777.        JMP NEXT
  1778. ANUMB  STX XTEMP         save X in XTEMP
  1779.        STA ATEMP         and A in ATEMP
  1780.        JSR MPY16         Q =     Q * BASE
  1781.        LDA ATEMP         get A back
  1782.        ADD QL            Q = Q + A
  1783.        STA QL
  1784.        LDA QH
  1785.        ADC #0
  1786.        STA QH
  1787.        LDX XTEMP         get X back
  1788.        CPX COUNTR        X > COUNTR ?
  1789.        BHI NUMOK
  1790.        JSR GET
  1791.        BRA NUMSKP
  1792. NUMOK  LDA TEMP         number OK, now check sign
  1793.        TSTA
  1794.        BEQ NUMPOS
  1795.        CLRA
  1796.        NEG QL
  1797.        SBC QH
  1798.        STA QH
  1799. NUMPOS LDX SP           push number at Q and flag
  1800.        LDA QL
  1801.        DECX
  1802.        STA SP0,X
  1803.        LDA QH
  1804.        DECX
  1805.        STA SP0,X
  1806.        LDA #$FF        TRUE flag
  1807.        BRA NUMXT+2
  1808. *
  1809.        FCB 4               DROP
  1810.        FCC 'DRO'
  1811.        FDB NUM8-6          link to <NUMBER>
  1812. DROP   LDX SP
  1813.        INCX
  1814.        INCX
  1815.        STX SP
  1816.        JMP NEXT
  1817. *
  1818.        FCB 2               C@
  1819.        FCC 'C@ '
  1820.        FDB DROP-6          link to DROP
  1821. CFCH   LDX SP
  1822.        LDA SP0,X
  1823.        INCX
  1824.        STA GET+1
  1825.        LDA SP0,X
  1826.        STA GET+2
  1827.        STX SP
  1828.        CLRX                get the byte
  1829.        JSR GET
  1830.        LDX SP
  1831.        STA SP0,X
  1832.        CLRA                zero high byte
  1833.        DECX
  1834.        STA SP0,X
  1835.        STX SP
  1836.        JMP NEXT
  1837. *
  1838.        FCB 1               @
  1839.        FCC '@  '
  1840.        FDB CFCH-6          link to C@
  1841. FTCH   LDX SP
  1842.        LDA SP0,X
  1843.        INCX
  1844.        STA GET+1
  1845.        LDA SP0,X
  1846.        STA GET+2
  1847.        STX SP
  1848.        LDX #1              get low byte
  1849.        JSR GET
  1850.        LDX SP
  1851.        STA SP0,X
  1852.        CLRX                get high byte
  1853.        JSR GET
  1854.        LDX SP
  1855.        DECX
  1856.        STA SP0,X
  1857.        STX SP
  1858.        JMP NEXT
  1859. *
  1860.        FCB 2               DP
  1861.        FCC 'DP '
  1862.        FDB FTCH-6          link to @
  1863. DP2   LDX SP               push address of DP to stack
  1864.       LDA #DP              this routine knows that DP is on page zero
  1865.       DECX
  1866.       STA SP0,X
  1867.       CLRA
  1868.       DECX
  1869.       STA SP0,X
  1870.       STX SP
  1871.       JMP NEXT
  1872. *
  1873.       FCB 4               HERE
  1874.       FCC 'HER'
  1875.       FDB DP2-6           Link to DP
  1876. HERE  JMP DOCOL
  1877.       FDB DP2
  1878.       FDB FTCH
  1879.       FDB EXIT
  1880. *
  1881.       FCB 3               NOT
  1882.       FCC 'NOT'
  1883.       FDB HERE-6          Link to HERE
  1884. NOT3  LDX SP
  1885.       LDA SP0,X
  1886.       COMA
  1887.       STA SP0,X
  1888.       INCX
  1889.       LDA SP0,X
  1890.       COMA
  1891.       STA SP0,X
  1892.       JMP NEXT
  1893. *
  1894.       FCB 2                 1+
  1895.       FCC '1+ '
  1896.       FDB NOT3-6            Link to NOT
  1897. ONEP  LDX SP
  1898.       INCX                  point to low byte
  1899.       LDA SP0,X
  1900.       ADD #1
  1901.       STA SP0,X
  1902.       LDX SP                now the high byte
  1903.       LDA SP0,X
  1904.       ADC #0
  1905.       STA SP0,X
  1906.       JMP NEXT
  1907. *
  1908.       FCB 3               HLD
  1909.       FCC 'HLD'
  1910.       FDB ONEP-6          link to 1+
  1911. HLD3  LDA #HLD            (fall through to DOUSE)
  1912. *
  1913. DOUSE ADD #USER                Does the common part of the
  1914.       LDX SP                   execution of a user variable
  1915.       DECX
  1916.       STA SP0,X
  1917.       CLRA
  1918.       DECX
  1919.       STA SP0,X
  1920.       STX SP
  1921.       JMP NEXT
  1922. *
  1923.       FCB 5                STATE
  1924.       FCC 'STA'
  1925.       FDB HLD3-6           link to HLD
  1926. STA5  LDA #STATE
  1927.       BRA DOUSE
  1928. *
  1929.       FCB 7                CONTEXT
  1930.       FCC 'CON'
  1931.       FDB STA5-6           link to STATE
  1932. CON7  LDA #CONTEXT
  1933.       BRA DOUSE
  1934. *
  1935.       FCB 7                CURRENT
  1936.       FCC 'CUR'
  1937.       FDB CON7-6           link to CONTEXT
  1938. CUR7  LDA #CURRENT
  1939.       BRA DOUSE
  1940. *
  1941.       FCB 5               FORTH
  1942.       FCC 'FOR'
  1943.       FDB CUR7-6          link to CURRENT
  1944. FOR5  LDA #FORTH
  1945.       BRA DOUSE
  1946. *
  1947.       FCB 1               !
  1948.       FCC '!  '
  1949.       FDB FOR5-6          link to FORTH
  1950. STO   LDX SP              move addr to Load
  1951.       LDA SP0,X
  1952.       INCX
  1953.       STA LOAD+1
  1954.       LDA SP0,X
  1955.       INCX
  1956.       STA LOAD+2
  1957.       LDA SP0,X           now move data to addr
  1958.       INCX                high byte first
  1959.       STX SP
  1960.       CLRX
  1961.       JSR LOAD
  1962.       LDX SP
  1963.       LDA SP0,X           now the low byte
  1964.       INCX
  1965.       STX SP
  1966.       LDX #1
  1967.       JSR LOAD
  1968.       JMP NEXT
  1969. *
  1970.       FCB 2               C!
  1971.       FCC 'C! '
  1972.       FDB STO-6           link to !
  1973. CSTO  LDX SP              move addr to Load
  1974.       LDA SP0,X
  1975.       INCX
  1976.       STA LOAD+1
  1977.       LDA SP0,X
  1978.       INCX
  1979.       STA LOAD+2
  1980.       INCX                drop high data byte
  1981.       LDA SP0,X           and move low byte
  1982.       INCX
  1983.       STX SP
  1984.       CLRX
  1985.       JSR LOAD
  1986.       JMP NEXT
  1987. *
  1988.       FCB 1                ,
  1989.       FCC ',  '
  1990.       FDB CSTO-6           link to C!
  1991. COMA  LDA DP               move DP to Load
  1992.       STA LOAD+1
  1993.       LDA DP+1
  1994.       STA LOAD+2
  1995.       LDX SP               move data to DP
  1996.       LDA SP0,X            high byte
  1997.       INCX
  1998.       STX SP
  1999.       CLRX
  2000.       JSR LOAD
  2001.       LDX SP               low byte
  2002.       LDA SP0,X
  2003.       INCX
  2004.       STX SP
  2005.       LDX #1
  2006.       JSR LOAD
  2007.       LDA #2
  2008. INCDP ADD DP+1             bump DP
  2009.       STA DP+1
  2010.       LDA DP
  2011.       ADC #0
  2012.       STA DP
  2013.       JMP NEXT
  2014. *
  2015.       FCB 2                C,
  2016.       FCC 'C, '
  2017.       FDB COMA-6
  2018. CCOMA LDA DP
  2019.       STA LOAD+1
  2020.       LDA DP+1
  2021.       STA LOAD+2
  2022.       LDX SP               move data to DP
  2023.       INCX                 drop high byte
  2024.       LDA SP0,X            get low byte
  2025.       INCX
  2026.       STX SP
  2027.       CLRX
  2028.       JSR LOAD
  2029.       LDA #1               bump DP by 1
  2030.       BRA INCDP
  2031.       FCB 3               DUP
  2032.       FCC 'DUP'
  2033.       FDB CCOMA-6         link to C,
  2034. DUP3  LDX SP
  2035.       LDA SP0,X           get high byte
  2036.       DECX                and bump SP to point to new location
  2037.       DECX
  2038.       STA SP0,X           then store it
  2039.       LDX SP
  2040.       INCX                get low byte
  2041.       LDA SP0,X
  2042.       DECX                bump SP for it too
  2043.       DECX
  2044.       STA SP0,X           and store it
  2045.       DECX                update SP
  2046.       STX SP
  2047.       JMP NEXT
  2048. *
  2049.       FCB 2               +!
  2050.       FCC '+! '
  2051.       FDB DUP3-6          link to DUP
  2052. PLSTO LDX SP              move Addr to Load and Get
  2053.       LDA SP0,X
  2054.       INCX
  2055.       STA LOAD+1
  2056.       STA GET+1
  2057.       LDA SP0,X
  2058.       INCX
  2059.       STA LOAD+2
  2060.       STA GET+2
  2061.       STX SP
  2062.       LDX #1              get low byte of addr data
  2063.       JSR GET
  2064.       LDX SP              get low byte of number
  2065.       INCX
  2066.       ADD SP0,X
  2067.       LDX #1
  2068.       JSR LOAD            and save it back
  2069.       CLRX                The same for the high byte
  2070.       JSR GET
  2071.       LDX SP
  2072.       ADC SP0,X
  2073.       CLRX
  2074.       JSR LOAD
  2075.       INC SP              update SP
  2076.       INC SP
  2077.       JMP NEXT
  2078. *
  2079.       FCB 6               LATEST
  2080.       FCC 'LAT'
  2081.       FDB PLSTO-6         link to +!
  2082. LAT6  JMP DOCOL
  2083.       FDB CUR7
  2084.       FDB FTCH
  2085.       FDB FTCH
  2086.       FDB EXIT
  2087. *
  2088.       FCB 5               ALLOT
  2089.       FCC 'ALL'
  2090.       FDB LAT6-6          link to LATEST
  2091. ALL5  JMP DOCOL
  2092.       FDB DP2
  2093.       FDB PLSTO
  2094.       FDB EXIT
  2095. *
  2096.       FCB 3                LIT
  2097.       FCC 'LIT'
  2098.       FDB ALL5-6
  2099. LIT3  LDA IP               move IP to Get
  2100.       STA GET+1
  2101.       LDA IP+1
  2102.       STA GET+2
  2103.       LDX #1               move low byte to stack
  2104.       JSR GET
  2105.       LDX SP
  2106.       DECX
  2107.       STA SP0,X
  2108.       STX SP
  2109.       CLRX                 and then the high byte
  2110.       JSR GET
  2111.       LDX SP
  2112.       DECX
  2113.       STA SP0,X
  2114.       STX SP
  2115.       LDA #2                now bump IP
  2116.       ADD IP+1
  2117.       STA IP+1
  2118.       CLRA
  2119.       ADC IP
  2120.       STA IP
  2121.       JMP NEXT
  2122. *
  2123. QIMM  LDX SP          Tests for IMMEDIATE
  2124.       INCX            using count byte
  2125.       LDA SP0,X       from <FIND>
  2126.       TSTA
  2127.       BMI QID
  2128.       CLRA
  2129.       BRA QSKIP
  2130. QID   LDA #$FF
  2131. QSKIP STA SP0,X
  2132.       DECX
  2133.       STA SP0,X
  2134.       JMP NEXT
  2135. *
  2136. MESS  FCB 67
  2137.       FCC 'RAFOS '
  2138.       FCC 'FORTH '
  2139.       FCC 'V1.0'
  2140. *
  2141.       FCB CR
  2142.       FCB LF
  2143.       FCC 'A TEAM ROSSBY PRODUCTION'
  2144. *
  2145.       FCB CR
  2146.       FCB LF
  2147.       FCC  '(C) EVERETT CARTER 1986' 
  2148. *
  2149. LOK   FCB 3
  2150. OK    FCC ' OK'         The FORTH prompt
  2151. *
  2152. *
  2153. *     DEFAULT OUTER INTERPRETER
  2154. *
  2155. *
  2156. OUTER FDB COU5
  2157.       FDB TYPE
  2158.       FDB INLINE
  2159.       FDB DFND
  2160.       FDB ZBRAN
  2161.       FDB $001E
  2162.       FDB QIMM
  2163.       FDB NOT3
  2164.       FDB ZBRAN
  2165.       FDB $0010
  2166.       FDB STA5
  2167.       FDB FTCH
  2168.       FDB ZBRAN
  2169.       FDB $0008
  2170.       FDB COMA
  2171.       FDB BRAN
  2172.       FDB $FFE6
  2173.       FDB EXE7
  2174.       FDB BRAN
  2175.       FDB $FFE0
  2176.       FDB HERE
  2177.       FDB NUM8
  2178.       FDB ZBRAN
  2179.       FDB $0014
  2180.       FDB STA5
  2181.       FDB FTCH
  2182.       FDB ZBRAN
  2183.       FDB $FFD0
  2184.       FDB COMP
  2185.       FDB LIT3
  2186.       FDB COMA
  2187.       FDB BRAN
  2188.       FDB $FFC6
  2189.       FDB QUES
  2190.       FDB BRAN
  2191.       FDB $FFBA
  2192. *               POWER ON RESET ROUTINE
  2193. *
  2194.       FCB 4                 COLD
  2195.       FCC 'COL'
  2196.       FDB LIT3-6            link to LIT
  2197. *
  2198. COLD  BSET3 $05
  2199.       BSET3 PUT
  2200.       LDX #$3F             Move the default RAM data
  2201. SDAT  LDA ROM,X
  2202.       STA 0,X
  2203.       DECX
  2204.       CPX #$20
  2205.       BNE SDAT
  2206.       LDX #$80             Move the self-modifying code
  2207. SREPT LDA ROM,X            to its executable location
  2208.       STA 0,X              (done in two steps to avoid the
  2209.       INCX                  CPUs stack: 40-7F)
  2210.       BNE SREPT
  2211.       CLRX
  2212. SREP2 LDA ROM+$100,X        (moving 200 HEX bytes)
  2213.       STA $100,X
  2214.       DECX
  2215.       BNE SREP2
  2216. *
  2217. *     Calculate the HIGH and LOW BYTES of OUTER
  2218. *
  2219. HO    EQU OUTER/$100*$100
  2220. LO    EQU OUTER-HO
  2221. HO1   EQU OUTER/$100
  2222. *
  2223.       LDA #LO               Load the default
  2224.       STA START+1           Outer Interpreter
  2225.       LDA #HO1              into START
  2226.       STA START
  2227. *
  2228. *     Calculate the HIGH and LOW BYTES of Latest entry
  2229. *
  2230. HCR   EQU LATEST/$100*$100
  2231. LCR   EQU LATEST-HCR
  2232. H1CR  EQU LATEST/$100
  2233. *
  2234.       LDA #H1CR         Initialize FORTH
  2235.       STA USER+FORTH
  2236.       LDA #LCR
  2237.       STA USER+FORTH+1
  2238. *
  2239. *
  2240. *     Calculate the HIGH and LOW BYTES of MESS
  2241. *
  2242. H     EQU MESS/$100*$100
  2243. L     EQU MESS-H
  2244. H1    EQU MESS/$100
  2245. *
  2246.       CLRX
  2247.       LDA #L              Push start up message
  2248.       DECX
  2249.       STA SP0,X
  2250.       LDA #H1
  2251.       DECX
  2252.       STA SP0,X
  2253.       STX SP             Initialize Stack Pointer
  2254. WARM  LDA #$80           Initialize input terminators
  2255.       STA TIB+$7E
  2256.       STA TIB+$7F
  2257.       CLR USER+STATE      Put system in EXECUTION state
  2258.       CLR USER+STATE+1
  2259.       CLR RP              Initialize Return Stack pointer
  2260.       JSR CRLF
  2261.       LDA START           Load the IP
  2262.       STA IP
  2263.       LDA START+1
  2264.       STA IP+1
  2265.       JMP NEXT            GO...
  2266. *
  2267.       FCB 4                 SWAP
  2268.       FCC 'SWA'
  2269.       FDB COLD-6            link to COLD
  2270. SWAP  LDX SP
  2271.       LDA SP0,X
  2272.       INCX
  2273.       STA PH
  2274.       LDA SP0,X
  2275.       INCX
  2276.       STA PL
  2277.       LDA SP0,X
  2278.       INCX
  2279.       STA QH
  2280.       LDA SP0,X
  2281.       STA QL
  2282.       LDA PL
  2283.       STA SP0,X
  2284.       LDA PH
  2285.       DECX
  2286.       STA SP0,X
  2287.       LDA QL
  2288.       DECX
  2289.       STA SP0,X
  2290.       LDA QH
  2291.       DECX
  2292.       STA SP0,X
  2293.       JMP NEXT
  2294. *
  2295.       FCB 3                 SP!
  2296.       FCC 'SP!'
  2297.       FDB SWAP-6            link to SWAP
  2298. SPSTO CLR SP
  2299.       JMP NEXT
  2300. *
  2301. *
  2302. *     S E R I A L  I/O  R O U T I N E S 
  2303. *     GETCHAR/GETC --- GET A CHARACTER FROM THE TERMINAL
  2304. *     A GETS THE CHARACTER TYPED, X IS UNCHANGED
  2305. GETC     STX XTEMP
  2306. GETCHAR  EQU GETC
  2307.          LDA #8
  2308.          STA COUNT
  2309. GETC4    CLI
  2310.          SEI
  2311.          BRSET2 PUT,GETC4
  2312.          LDA PUT
  2313.          AND #!11
  2314.          TAX
  2315.          LDX DELAYS,X                  load Baud delay
  2316. GETC3    LDA #4
  2317. GETC2    DECA
  2318.          BNE GETC2
  2319.          TSTA
  2320.          DECX
  2321.          BNE GETC3
  2322.          BRSET2 PUT,GETC4
  2323.          TST ,X
  2324.          TST ,X
  2325. GETC7    BSR  DELAY
  2326.          BRCLR2 PUT,GETC6
  2327. GETC6    TST ,X
  2328.          ROR CHAR
  2329.          DEC COUNT
  2330.          BNE GETC7
  2331.          CLI
  2332.          BSR DELAY
  2333.          LDA CHAR
  2334.          AND    #$7F         Mask the eighth bit. 
  2335.          LDX XTEMP
  2336.          RTS
  2337. *     OUTCHAR/PUTC --- PRINT A ON THE TERMINAL
  2338. *     X AND A UNCHANGED 
  2339. PUTC     STA CHAR
  2340. OUTCHAR  EQU PUTC
  2341.          STA ATEMP
  2342.          STX XTEMP
  2343.          LDA #9
  2344.          STA COUNT
  2345.          CLRX
  2346.          CLC
  2347.          SEI
  2348.          BRA PUTC2
  2349. PUTC5    ROR CHAR
  2350. PUTC2    BCC PUTC3
  2351.          BSET3 PUT
  2352.          BRA PUTC4
  2353. PUTC3    BCLR3 PUT
  2354.          BRA PUTC4
  2355. PUTC4    JSR DELAY,X
  2356.          DEC COUNT
  2357.          BNE PUTC5
  2358.          BSET2 PUT
  2359.          BSET3 PUT
  2360.          CLI
  2361.          BSR DELAY
  2362.          LDX XTEMP
  2363.          LDA ATEMP
  2364.          RTS
  2365. *     WAIT --- PRECISE DELAY
  2366. *              A AND X ARE ZERO AT EXIT. 
  2367. WAIT     LDA    #1           ADJUST FOR FIRST TIME
  2368. DELAY    EQU WAIT
  2369.          AND #!11
  2370.          TAX
  2371.          LDX DELAYS,X
  2372.          LDA #$F9
  2373. DEL3     ADD #$08
  2374. DEL2     DECA
  2375.          BNE DEL2
  2376.          TSTX
  2377.          BSET1 PUT
  2378.          DECX
  2379.          BNE DEL3
  2380.          LDA #0
  2381.          RTS
  2382. *
  2383. DELAYS   FCB  $20          300 BAUD
  2384.          FCB  $08         1200 BAUD
  2385.          FCB  $01         9600 BAUD
  2386. *
  2387. *
  2388. CRLF     LDA #CR
  2389.          JSR OUTCHAR
  2390.          LDA #LF
  2391.          JSR OUTCHAR
  2392.          RTS
  2393. *
  2394.       FCB 2                 CR
  2395.       FCC 'CR '
  2396.       FDB SPSTO-6           link to SP!
  2397. CR2   BSR CRLF
  2398.       JMP NEXT
  2399.       FCB 6                 CREATE
  2400.       FCC 'CRE'
  2401.       FDB CR2-6            link to CR
  2402. CRE6  JMP DOCOL
  2403.       FDB BL2
  2404.       FDB WORD
  2405.       FDB LIT3
  2406.       FDB #04
  2407.       FDB ALL5
  2408.       FDB LAT6
  2409.       FDB COMA
  2410.       FDB CUR7
  2411.       FDB FTCH
  2412.       FDB STO
  2413.       FDB EXIT
  2414. ********************************************************************************
  2415. *     INTERRUPT VECTORS 
  2416.          ORG    MEMSIZ-10    START OF VECTORS 
  2417.          FDB    WTIME        TIMER IRQ VECTOR FROM WAIT STATE 
  2418.          FDB    WTIME+3      ALTERNATE TIMER VECTOR 
  2419.          FDB    WTIME+6      IRQ VECTOR.
  2420.          FDB    WARM         SWI TO FORTH INITIALIZATION POINT
  2421.          FDB    COLD         POWER ON VECTOR
  2422. *
  2423.          END
  2424.  
  2425.  
  2426.  
  2427.  
  2428.  
  2429.  
  2430.  
  2431.